/**
 * @File Name: sqlconnRAII.h
 * @brief  实现SqlConn连接对象RAII机制的类
 * @Author : beyon_sir email:caoboyang.chn@gmail.com
 * @Version : 1.0
 * @Create Date : 2022-11-21
 * 
 */
#ifndef SQLCONNRAII_H
#define SQLCONNRAII_H
#include "sqlconnpool.h"

/* 资源在对象构造初始化 资源在对象析构时释放*/
// 子线程通过调用SqlConnRAII来申请SqlConnPool中的资源 
class SqlConnRAII {
public:
    SqlConnRAII(MYSQL** sql, SqlConnPool *connpool) {
        assert(connpool);
        // 设置二级指针是为了确保sql_ 和传入的connpool->GetConn() 的指针本身存储的地址相同 两个是一模一样的
        // 而如果只有一级指针 然后 sql = connpool->GetConn(),这样的话虽然两个指针指向的都是同一个MySQL 
        // 但是指针本身地址不同 完全是两个不同指针指向同一对象 就无法通过修改sql_ 来影响connpool->GetConn() 传来的指针的行为。
        *sql = connpool->GetConn();
        sql_ = *sql;
        connpool_ = connpool;
    }
    
    ~SqlConnRAII() {
        if(sql_) { connpool_->FreeConn(sql_); }
    }
    
private:
    MYSQL *sql_;
    SqlConnPool* connpool_;
};

#endif //SQLCONNRAII_H